using System;
using InfiniTec.Data;

namespace InfiniTec.DirectoryServices
{
    public static class WellknownProperties
    {
        /// <summary>
        /// This class defines property names with special semantics.
        /// </summary>
        public static class Special
        {
            /// <summary>
            /// This property specifies the AmbiguousNameResolution.
            /// </summary>
            public static readonly PropertyDefinition<string> AmbiguousNameResolution = new PropertyDefinition<string>("anr", false);
        }
        /// <summary>
        /// This class defines properties common to most ActiveDirectory principal objects
        /// </summary>
        public static class Common
        {
            /// <summary>
            /// The property for NT4 logon name
            /// </summary>
            public static readonly PropertyDefinition<string> NT4AccountName = new PropertyDefinition<string>("sAMAccountName", false);

            /// <summary>
            /// The property distinguished name.
            /// </summary>
            public static readonly PropertyDefinition<string> DistinguishedName = new PropertyDefinition<string>("distinguishedName", false);

            /// <summary>
            /// The name of the the canonical name.
            /// </summary>
            public static readonly PropertyDefinition<string> CanonicalName = new PropertyDefinition<string>("canonicalName", false);
            /// <summary>
            /// The name of the the legacyExchangeDn property
            /// </summary>
            public static readonly PropertyDefinition<string> LegacyExchangeDn = new PropertyDefinition<string>("legacyExchangeDN", false);

            /// <summary>
            /// The name of the theelative name
            /// </summary>
            public static readonly PropertyDefinition<string> RelativeName = new PropertyDefinition<string>("cn", false);

            /// <summary>
            /// The name of the the display name
            /// </summary>
            public static readonly PropertyDefinition<string> DisplayName = new PropertyDefinition<string>("displayName", false);

            /// <summary>
            /// The name of the the object class
            /// </summary>
            public static readonly PropertyDefinition<string> ObjectClass = new PropertyDefinition<string>("objectClass", true);

            /// <summary>
            /// The name of the the object category
            /// </summary>
            public static readonly PropertyDefinition<string> ObjectCategory = new PropertyDefinition<string>("objectCategory", false);
            /// <summary>
            /// The name of the the object guid
            /// </summary>
            public static readonly PropertyDefinition<Guid> ObjectGuid = new PropertyDefinition<Guid>("objectGUID", false);

            /// <summary>
            /// The name of the the security identifier
            /// </summary>
            public static readonly PropertyDefinition<byte[]> ObjectSid = new PropertyDefinition<byte[]>("objectSid", false);

            /// <summary>
            /// The name of the the SAM account type
            /// </summary>
            public static readonly PropertyDefinition<PrincipalType?> SAMAccountType = new PropertyDefinition<PrincipalType?>("sAMAccountType", false);
        }

        /// <summary>
        /// This class defines names of properties available on theootDSE node.
        /// </summary>
        public static class RootDse
        {
            /// <summary>
            /// The name of the the default naming context
            /// </summary>
            public static readonly PropertyDefinition<string> DefaultNamingContext = new PropertyDefinition<string>("defaultNamingContext", false);
            /// <summary>
            /// The name of the theoot naming context
            /// </summary>
            public static readonly PropertyDefinition<string> RootNamingContext = new PropertyDefinition<string>("rootDomainNamingContext", false);

            /// <summary>
            /// The name of the the configuration context
            /// </summary>
            public static readonly PropertyDefinition<string> ConfigurationContext = new PropertyDefinition<string>("configurationNamingContext", false);

            /// <summary>
            /// The name of the the schema naming context
            /// </summary>
            public static readonly PropertyDefinition<string> SchemaNamingContext = new PropertyDefinition<string>("schemaNamingContext", false);

            /// <summary>
            /// The name of the the naming contexts
            /// </summary>
            public static readonly PropertyDefinition<string> NamingContexts = new PropertyDefinition<string>("namingContexts", true);
        }

        /// <summary>
        /// This class contains names of properties available on principal objects which 
        /// specify group membership.
        /// </summary>
        public static class GroupMembership
        {
            /// <summary>
            /// The property for the memberOf property.
            /// </summary>
            public static readonly PropertyDefinition<string> MemberOf = new PropertyDefinition<string>("memberOf", true);
            /// <summary>
            /// The name of the the tokenGroups property.
            /// </summary>
            public static readonly PropertyDefinition<byte[]> TokenGroups = new PropertyDefinition<byte[]>("tokenGroups", true);

            /// <summary>
            /// The name of the the globalAndUniversalTokenGroups property
            /// </summary>
            public static readonly PropertyDefinition<byte[]> GlobalAndUniversalTokenGroups = new PropertyDefinition<byte[]>("tokenGroupsGlobalAndUniversal", true);

            /// <summary>
            /// The name of the the noGCAcceptableTokenGroups property
            /// </summary>
            public static readonly PropertyDefinition<byte[]> NoGCAcceptableTokenGroups = new PropertyDefinition<byte[]>("tokenGroupsNoGCAcceptable", true);
        }

        /// <summary>
        /// This class defines names of properties available on group objects
        /// </summary>
        public static class Group
        {
            /// <summary>
            /// The name of the the members property
            /// </summary>
            public static readonly PropertyDefinition<string> Member = new PropertyDefinition<string>("member", true);

            /// <summary>
            /// The name of the the groupType property
            /// </summary>
            public static readonly PropertyDefinition<GroupType?> GroupType = new PropertyDefinition<GroupType?>("groupType", false);
        }

        /// <summary>
        /// This class defines names of properties available on user objects
        /// </summary>
        public static class User
        {
            /// <summary>
            /// The name of the the co property
            /// </summary>
            public static readonly PropertyDefinition<string> Country = new PropertyDefinition<string>("co", false);

            /// <summary>
            /// The name of the the company property
            /// </summary>
            public static readonly PropertyDefinition<string> Company = new PropertyDefinition<string>("company", false);

            /// <summary>
            /// The name of the the department property
            /// </summary>
            public static readonly PropertyDefinition<string> Department = new PropertyDefinition<string>("department", false);

            /// <summary>
            /// The name of the the description property
            /// </summary>
            public static readonly PropertyDefinition<string> Description = new PropertyDefinition<string>("description", false);

            /// <summary>
            /// The name of the the facsimileTelephoneNumber property
            /// </summary>
            public static readonly PropertyDefinition<string> FaxNumber = new PropertyDefinition<string>("facsimileTelephoneNumber", false);

            /// <summary>
            /// The name of the the giveName property
            /// </summary>
            public static readonly PropertyDefinition<string> FirstName = new PropertyDefinition<string>("givenName", false);

            /// <summary>
            /// The name of the the homePhone property
            /// </summary>
            public static readonly PropertyDefinition<string> HomePhone = new PropertyDefinition<string>("homePhone", false);

            /// <summary>
            /// The name of the the intials property
            /// </summary>
            public static readonly PropertyDefinition<string> Initials = new PropertyDefinition<string>("initials", false);

            /// <summary>
            /// The name of the the ipPhone property
            /// </summary>
            public static readonly PropertyDefinition<string> IPPhone = new PropertyDefinition<string>("ipPhone", false);

            /// <summary>
            /// The name of the the l property
            /// </summary>
            public static readonly PropertyDefinition<string> City = new PropertyDefinition<string>("l", false);
            /// <summary>
            /// The name of the the mail property
            /// </summary>
            public static readonly PropertyDefinition<string> MailAddress = new PropertyDefinition<string>("mail", false);
            /// <summary>
            /// The name of the the proxyAddresses property
            /// </summary>
            public static readonly PropertyDefinition<string> ProxyAddresses = new PropertyDefinition<string>("proxyAddresses", true);

            /// <summary>
            /// The name of the the manager property
            /// </summary>
            public static readonly PropertyDefinition<string> Manager = new PropertyDefinition<string>("manager", false);

            /// <summary>
            /// The name of the the mobile property
            /// </summary>
            public static readonly PropertyDefinition<string> Mobile = new PropertyDefinition<string>("mobile", false);

            /// <summary>
            /// The name of the the otherFacsimileTelephoneNumber property
            /// </summary>
            public static readonly PropertyDefinition<string> OtherFaxNumbers = new PropertyDefinition<string>("otherFacsimileTelephoneNumber", false);

            /// <summary>
            /// The name of the the otherHomePhone property
            /// </summary>
            public static readonly PropertyDefinition<string> OtherHomePhones = new PropertyDefinition<string>("otherHomePhone", false);

            /// <summary>
            /// The name of the the otherIpPhone property
            /// </summary>
            public static readonly PropertyDefinition<string> OtherIPPhones = new PropertyDefinition<string>("otherIpPhone", false);

            /// <summary>
            /// The name of the the otherMobile property
            /// </summary>
            public static readonly PropertyDefinition<string> OtherMobile = new PropertyDefinition<string>("otherMobile", false);
            /// <summary>
            /// The name of the the otherPager property
            /// </summary>
            public static readonly PropertyDefinition<string> OtherPager = new PropertyDefinition<string>("otherPager", false);

            /// <summary>
            /// The name of the the otherTelephone property
            /// </summary>
            public static readonly PropertyDefinition<string> OtherTelephoneNumbers = new PropertyDefinition<string>("otherTelephone", false);

            /// <summary>
            /// The name of the the pager property
            /// </summary>
            public static readonly PropertyDefinition<string> PagerNumber = new PropertyDefinition<string>("pager", false);

            /// <summary>
            /// The name of the the physicalDeliveryOfficeName property
            /// </summary>
            public static readonly PropertyDefinition<string> Office = new PropertyDefinition<string>("physicalDeliveryOfficeName", false);

            /// <summary>
            /// The name of the the postalCode property
            /// </summary>
            public static readonly PropertyDefinition<string> PostalCode = new PropertyDefinition<string>("postalCode", false);

            /// <summary>
            /// The name of the the postOfficeBox property
            /// </summary>
            public static readonly PropertyDefinition<string> PostOfficeBox = new PropertyDefinition<string>("postOfficeBox", false);

            /// <summary>
            /// The name of the the sn property
            /// </summary>
            public static readonly PropertyDefinition<string> LastName = new PropertyDefinition<string>("sn", false);

            /// <summary>
            /// The name of the the st property
            /// </summary>
            public static readonly PropertyDefinition<string> State = new PropertyDefinition<string>("st", false);

            /// <summary>
            /// The name of the the streetAddress property
            /// </summary>
            public static readonly PropertyDefinition<string> StreetAddress = new PropertyDefinition<string>("streetAddress", false);

            /// <summary>
            /// The name of the the telephoneNumber property
            /// </summary>
            public static readonly PropertyDefinition<string> TelephoneNumber = new PropertyDefinition<string>("telephoneNumber", false);

            /// <summary>
            /// The name of the the title property
            /// </summary>
            public static readonly PropertyDefinition<string> Title = new PropertyDefinition<string>("title", false);

            /// <summary>
            /// The name of the the url property
            /// </summary>
            public static readonly PropertyDefinition<string> OtherWebPage = new PropertyDefinition<string>("url", false);

            /// <summary>
            /// The name of the the userPrincipalName property
            /// </summary>
            public static readonly PropertyDefinition<string> UserPrincipalName = new PropertyDefinition<string>("userPrincipalName", false);

            /// <summary>
            /// The name of the the wWWHomePage property
            /// </summary>
            public static readonly PropertyDefinition<string> WebPage = new PropertyDefinition<string>("wWWHomePage", false);
        }

        /// <summary>
        /// This class defines names of object categories used in ActiveDirectory
        /// </summary>
        public static class ObjectCategories
        {
            /// <summary>
            /// Specifies a group object
            /// </summary>
            public const string Group = "Group";
            /// <summary>
            /// Specifies a user object
            /// </summary>
            public const string Person = "Person";
            /// <summary>
            /// Specifies a Commputer object
            /// </summary>
            public const string Computer = "Computer";
        }
        /// <summary>
        /// This class defines various object classes used in ActiveDirectory
        /// </summary>
        public static class ObjectClasses
        {
            /// <summary>
            /// A group object
            /// </summary>
            public const string Group = "group";
            /// <summary>
            /// A user object
            /// </summary>
            public const string User = "user";
            /// <summary>
            /// A contact object
            /// </summary>
            public const string Contact = "contact";
            /// <summary>
            /// Specifies a Commputer object
            /// </summary>
            public const string Computer = "computer";
        }
    }
}